package de.bib.dashboard;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Properties;

import org.apache.log4j.PropertyConfigurator;

/**
 * 
 * Kelas pembantu untuk mengakses system property yang didefine dengan argument
 * -D.<br>
 * Kelas ini adalah singleton karena hanya ada satu system properties.
 * 
 * @author "Jon Andika"
 * 
 */
public final class SystemProperties {

	/**
	 * Instance singleton.
	 */
	private static SystemProperties instance;

	private Properties prop = new Properties();

	/**
	 * Tidak bisa di construct dari luar.
	 */
	private SystemProperties() {
	}

	/**
	 * Ambil instance.
	 * 
	 * @return singleton
	 */
	public static SystemProperties getInstance() {
		if (instance == null) {
			instance = new SystemProperties();
		}
		return instance;
	}

	/**
	 * Ambil sebuah nilai property yang didefine sebagai system property.
	 * 
	 * @param name
	 *            nama property seperti <code>com.andia.parameter</code>
	 * @return nilai property atau null jika property tidak ada.
	 */
	public String get(final String name) {
		return System.getProperty(name);
	}

	/**
	 * Ambil sebuah nilai property yang didegine atau kembalikan default value
	 * yang diberikan.
	 * 
	 * @param name
	 *            nama property seperti <code>com.andia.cm.property</code>
	 * @param defaultValue
	 *            default value jika property tidak ada.
	 * @return nilai property atau default valye yang diberikan.
	 */
	public String get(final String name, final String defaultValue) {
		if (!System.getProperties().containsKey(name)) {
			return defaultValue;
		}
		return System.getProperty(name);
	}

	public String getProperties(final String name) {
		return prop.getProperty(name);
	}

	@SuppressWarnings("rawtypes")
	public void loadProperties(String name) throws IOException {
		InputStream input = null;

		try {

			// input = getClass().getClassLoader().getResourceAsStream(name);
			input = new FileInputStream(name);

			// load a properties file
			Properties extProp = new Properties();
			extProp.load(input);

			for (Iterator it = extProp.keySet().iterator(); it.hasNext();) {
				String extKey = it.next().toString();
				prop.setProperty(extKey, extProp.getProperty(extKey));
			}
		} finally {
			if (input != null) {
				try {
					input.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}

	public void loadLog4j(String name) {
		PropertyConfigurator.configure(name);
	}

	/**
	 * Apakah ada property dengan nama tersebut.
	 * 
	 * @param name
	 *            nama property
	 * @return true jika ada atau false jika sebaliknya
	 */
	public boolean has(String name) {
		return get(name) != null;
	}

}
